package com.mall.mymall.controller;


import com.mall.mymall.common.Result;
import com.mall.mymall.dao.dto.QueryDto;
import com.mall.mymall.dao.dto.StoresDto;
import com.mall.mymall.dao.dto.querypage.OrganizationPageRequest;
import com.mall.mymall.dao.dto.querypage.StorePageRequest;
import com.mall.mymall.dao.entity.Organizations;
import com.mall.mymall.dao.entity.Stores;
import com.mall.mymall.service.OrganizationsService;
import com.mall.mymall.service.StoresService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/stores")
public class StoresController {

    @Autowired
    private StoresService storesService;

    /**
     * 处理商店信息的分页查询请求
     *
     * @param storePageRequest 包含分页查询参数的请求对象
     * @return 返回一个Result对象，其中包含分页查询结果
     */
    @PostMapping("/pageQuery")
    public Result<QueryDto<StoresDto>> pageStores(@RequestBody StorePageRequest storePageRequest) {
        // 调用service层的分页查询方法，并将结果封装到Result对象中返回
        return Result.success(storesService.pageStores(storePageRequest));
    }

    /**
     * 添加门店信息
     *
     * 该方法通过POST请求接收一个Stores对象，将其保存到数据库中
     * 使用HTTP POST方法是因为它适合于创建新的资源
     *
     * @param stores 要添加的门店信息，以JSON格式通过请求体传入
     * @return 返回一个Result对象，包含执行结果和添加的门店信息
     */
    @PostMapping("/add")
    public Result<Stores> addStores(@RequestBody Stores stores) {
        // 调用service层的save方法保存门店信息
        try {
            storesService.save(stores);
            return Result.success(stores);
        } catch (Exception e) {
//            throw new RuntimeException(e);
            return Result.fail("保存失败");
        }
        // 返回成功结果，包含添加的门店信息

    }

    /**
     * 更新指定商店信息的接口
     * <p>
     * 该接口用于更新一个已经存在的商店信息通过其ID它接受一个包含商店信息的请求体，
     * 并使用MyBatis-Plus的updateById方法更新数据库中的相应记录
     *
     * @param storeId 商店的唯一标识符，用于定位要更新的商店记录
     * @param stores 包含要更新的商店信息的实体对象
     * @return 返回一个Result对象，包含更新后的商店信息表示操作成功
     */
    @PutMapping("/update/{storeId}")
    public Result<Stores> updateStores(@PathVariable("storeId") Long storeId, @RequestBody Stores stores) {
        // 调用服务层接口，更新商店信息
        try {
            storesService.updateById(stores);
            return Result.success(stores);
        } catch (Exception e) {
            return Result.fail("更新失败");
        }
        // 返回成功结果，包含更新后的商店信息

    }

    /**
     * 删除指定的商店信息
     * 此方法通过DeleteMapping注解映射到/delete/{storeId}路径，支持HTTP DELETE请求
     * 通过路径变量storeId获取商店ID，并调用storesService的removeById方法删除对应商店信息
     * 删除成功后，返回删除成功的消息，不返回具体数据
     *
     * @param storeId 商店ID，用于标识要删除的商店
     * @return 返回一个Result对象，包含删除结果信息，删除成功时不返回具体数据
     */
    @DeleteMapping("/delete/{storeId}")
    public Result<Stores> deleteStores(@PathVariable("storeId") Long storeId) {
        try {
            storesService.removeById(storeId);
            return Result.success(null,"删除成功");
        } catch (Exception e) {
            return Result.fail("删除失败");
//            throw new RuntimeException(e);
        }

    }

    /**
     * 处理获取所有门店信息的GET请求
     *
     * @return 返回一个Result对象，其中包含门店信息的列表
     */
    @GetMapping("/getAll")
    public Result<List<Stores>> getAllStores() {
        // 调用Service层的list方法获取所有门店信息的列表
        List<Stores> list = storesService.list();
        // 返回成功结果，包含门店信息列表
        return Result.success(list);
    }

    /**
     * 读取单个门店
     * @param storesDto
     * @return
     */
    @PostMapping("/loadStore")
    public Result<Stores> loadStore(@RequestBody StoresDto storesDto) {
        Stores stores = storesService.getById(storesDto.getStoreId());
        // 返回成功结果
        return Result.success(stores);
    }
}
